ИППРПО

Docker. Образы

ИППРПО

План лекции

  • Введение в Docker-образы
  • Структура и слои образов
  • Команды работы с образами
  • Создание собственных образов
  • Оптимизация размера образов
  • Безопасность образов
  • Управление образами в реестрах
  • Практические примеры
  • Подведение итогов
Docker. Образы
ИППРПО

Введение в Docker-образы

Docker-образ — это неизменяемый шаблон, содержащий все необходимое для запуска приложения:

  • Исполняемые файлы и библиотеки
  • Исходный код приложения
  • Зависимости и пакеты
  • Переменные окружения
  • Конфигурационные файлы
Docker. Образы
ИППРПО

Отличие образа от контейнера

  • Образ — это шаблон, «фотография» приложения в определённый момент времени
  • Контейнер — это запущенный экземпляр образа
  • Один образ может создать множество контейнеров
  • Образы неизменяемы (immutable), контейнеры могут изменяться во время работы
docker images    # список образов
docker ps        # список контейнеров
Docker. Образы
ИППРПО

Структура Docker-образа

Docker-образ состоит из слойов (layers):

  • Каждая инструкция в Dockerfile создаёт новый слой
  • Слои кэшируются и могут использоваться повторно
  • Образ строится по принципу «наслоения» (layered filesystem)
Базовый образ (Ubuntu, Alpine, etc.)
↓
Слой 1: Установка зависимостей
↓
Слой 2: Копирование исходного кода
↓
Слой 3: Компиляция приложения
↓
Слой 4: Настройка окружения
Docker. Образы
ИППРПО

Просмотр слоев образа

docker history nginx:latest

Вывод показывает:

  • История создания образа
  • Размер каждого слоя
  • Команды, создавшие слои
  • Комментарии к слоям
Docker. Образы
ИППРПО

Типы образов

  1. Официальные образы — от Docker Hub или производителей ПО
  2. Пользовательские образы — созданные разработчиками
  3. Базовые образы — минимальные образы (alpine, ubuntu, debian)
  4. Специализированные образы — оптимизированные под конкретные задачи
Docker. Образы
ИППРПО

Базовые образы

Образ Размер Особенности
alpine ~5MB Минималистичный, на базе musl libc
ubuntu ~70MB Полноценная ОС, apt-пакеты
debian ~50MB Стабильность, широкая поддержка
busybox ~1MB Ultra-минималистичный
scratch 0B Пустой образ, только для бинарников
Docker. Образы
ИППРПО

Команды работы с образами

# Поиск образа
docker search nginx

# Скачать образ
docker pull nginx:latest

# Список локальных образов
docker images

# Удалить образ
docker rmi nginx:latest

# Просмотр информации об образе
docker inspect nginx:latest
Docker. Образы
ИППРПО

Тегирование образов

Теги позволяют управлять версиями образов:

# Создание тега
docker tag nginx:latest my-nginx:v1.0

# Пуш в репозиторий
docker tag my-app:latest docker.io/username/my-app:v1.0
docker push docker.io/username/my-app:v1.0

# Правила именования:
# [регистр/]имя_репозитория:тег
Docker. Образы
ИППРПО

Создание собственных образов

Способы создания образов:

  1. Через Dockerfile — рекомендуемый способ
  2. Через commit контейнера — для отладки
  3. Импорт из tar-архива — для миграции
# Создание образа из контейнера
docker commit my-container my-image:latest

# Импорт/экспорт
docker export container > container.tar
docker import container.tar my-image:latest
Docker. Образы
ИППРПО

Dockerfile — основной способ создания

# Базовый образ
FROM node:18-alpine

# Метаданные
LABEL maintainer="developer@example.com"
LABEL version="1.0"
LABEL description="Web application"

# Установка рабочей директории
WORKDIR /app

# Копирование файлов зависимостей
COPY package*.json ./

# Установка зависимостей
RUN npm ci --only=production

# Копирование исходного кода
COPY . .

# Открытие порта
EXPOSE 3000

# Команда запуска
CMD ["node", "server.js"]
Docker. Образы
ИППРПО

Инструкции Dockerfile

Инструкция Назначение Пример
FROM Базовый образ FROM ubuntu:22.04
RUN Выполнение команд RUN apt-get update
COPY Копирование файлов COPY . /app
ADD Копирование + распаковка ADD archive.tar.gz /
WORKDIR Рабочая директория WORKDIR /app
ENV Переменные окружения ENV NODE_ENV=production
EXPOSE Открытие порта EXPOSE 8080
CMD Команда по умолчанию CMD ["npm", "start"]
ENTRYPOINT Точка входа ENTRYPOINT ["python"]
Docker. Образы
ИППРПО

Сборка образа

# Базовая сборка
docker build -t my-app:latest .

# Сборка с контекстом
docker build -t my-app:latest ./docker

# Использование кэша
docker build --no-cache -t my-app:latest .

# Сборка с аргументами
docker build --build-arg NODE_VERSION=18 -t my-app:latest .
Docker. Образы
ИППРПО

Аргументы сборки (ARG)

# Определение аргументов
ARG NODE_VERSION=18
ARG APP_VERSION=1.0

# Использование аргументов
FROM node:${NODE_VERSION}-alpine
ENV VERSION=${APP_VERSION}

# Сборка с аргументами
docker build \
  --build-arg NODE_VERSION=16 \
  --build-arg APP_VERSION=2.0 \
  -t my-app:v2.0 .
Docker. Образы
ИППРПО

Многоэтапная сборка

# Этап 1: Сборка
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Этап 2: Финальный образ
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Преимущества:

  • Меньший размер финального образа
  • Отсутствие исходного кода и зависимостей сборки
  • Безопасность и производительность
Docker. Образы
ИППРПО

Оптимизация размера образов

Проблемы больших образов:

  • Долгая загрузка и распаковка
  • Больше занимаемого места
  • Медленное развертывание

Методы оптимизации:

  1. Использование минимальных базовых образов
  2. Объединение команд RUN
  3. Удаление временных файлов
  4. Использование .dockerignore
  5. Многоэтапная сборка
Docker. Образы
ИППРПО

Пример оптимизации

# Плохо: большой образ
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y nodejs
RUN apt-get install -y npm
RUN npm install
RUN apt-get clean

# Хорошо: оптимизированный
FROM node:18-alpine
RUN apk add --no-cache python3 make g++
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
COPY . .
Docker. Образы
ИППРПО

Файл .dockerignore

# Игнорировать системные файлы
.git
.gitignore
README.md

# Игнорировать зависимости разработки
node_modules
npm-debug.log
.env.local
.env.development

# Игнорировать временные файлы
*.log
*.tmp
.DS_Store
Thumbs.db

# Игнорировать тесты и документацию
tests/
docs/
coverage/
Docker. Образы
ИППРПО

Безопасность образов

Риски:

  • Уязвимости в базовых образах
  • Секреты в образах
  • Необновленные зависимости
  • Излишние привилегии

Меры безопасности:

  1. Использование официальных образов
  2. Регулярное обновление базовых образов
  3. Сканирование на уязвимости
  4. Минимизация привилегий
  5. Использование USER в Dockerfile
Docker. Образы
ИППРПО

Сканирование образов

# Использование Docker Scout
docker scout cves nginx:latest

# Использование Trivy
trivy image nginx:latest

# Использование Snyk
snyk container test nginx:latest

# Просмотр отчета
docker scout quickview my-app:latest
Docker. Образы
ИППРПО

Безопасный Dockerfile

# Использование специфичной версии
FROM node:18.19.0-alpine3.19

# Создание непривилегированного пользователя
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

# Установка зависимостей без кэша
RUN apk add --no-cache dumb-init

# Копирование и изменение владельца
COPY --chown=nextjs:nodejs . .

# Переключение на непривилегированного пользователя
USER nextjs

# Использование dumb-init для обработки сигналов
ENTRYPOINT ["dumb-init", "--"]
CMD ["node", "server.js"]
Docker. Образы
ИППРПО

Управление образами в реестрах

Типы реестров:

  • Docker Hub (публичный)
  • Приватные реестры (Docker Registry, Harbor)
  • Облачные реестры (ECR, GCR, ACR)
  • Корпоративные реестры
# Работа с приватным реестром
docker login registry.company.com
docker tag my-app:latest registry.company.com/team/my-app:v1.0
docker push registry.company.com/team/my-app:v1.0
docker pull registry.company.com/team/my-app:v1.0
Docker. Образы
ИППРПО

Создание приватного реестра

# Запуск локального реестра
docker run -d -p 5000:5000 --name registry registry:2

# Пуш образа в локальный реестр
docker tag my-app:latest localhost:5000/my-app:v1.0
docker push localhost:5000/my-app:v1.0

# Пул образа из локального реестра
docker pull localhost:5000/my-app:v1.0
Docker. Образы
ИППРПО

Управление жизненным циклом образов

# Просмотр истории образа
docker history my-app:latest

# Просмотр метаданных
docker inspect my-app:latest

# Удаление неиспользуемых образов
docker image prune

# Удаление всех неиспользуемых образов
docker image prune -a

# Удаление конкретного образа
docker rmi my-app:latest
Docker. Образы
ИППРПО

Практический пример 1: Веб-приложение на Python

FROM python:3.11-slim

# Установка системных зависимостей
RUN apt-get update && apt-get install -y \
    gcc \
    && rm -rf /var/lib/apt/lists/*

# Создание рабочей директории
WORKDIR /app

# Копирование requirements
COPY requirements.txt .

# Установка Python-зависимостей
RUN pip install --no-cache-dir -r requirements.txt

# Копирование кода приложения
COPY . .

# Открытие порта
EXPOSE 8000

# Команда запуска
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
Docker. Образы
ИППРПО

Практический пример 2: Multi-stage для Go

# Stage 1: Сборка
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

# Stage 2: Финальный образ
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]
Docker. Образы
ИППРПО

Практический пример 3: Frontend приложение

# Stage 1: Сборка React приложения
FROM node:18-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Stage 2: Обслуживание через Nginx
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Docker. Образы
ИППРПО

Отладка образов

# Запуск контейнера в интерактивном режиме
docker run -it my-app:latest /bin/sh

# Просмотр файловой системы
docker run --rm my-app:latest ls -la /app

# Проверка переменных окружения
docker run --rm my-app:latest env

# Запуск с отладочной информацией
docker build --progress=plain -t my-app:latest .
Docker. Образы
ИППРПО

Лучшие практики

  1. Используйте специфичные теги вместо latest
  2. Минимизируйте размер образа через многоэтапную сборку
  3. Сканируйте образы на уязвимости
  4. Используйте .dockerignore для исключения ненужных файлов
  5. Запускайте от непривилегированного пользователя
  6. Кэшируйте зависимости отдельно от кода приложения
  7. Документируйте образы через LABEL инструкции
Docker. Образы
ИППРПО

Резюме

Docker-образы — это основа контейнеризации:

  • Представляют собой неизменяемые шаблоны для контейнеров
  • Состоят из слоев, что обеспечивает эффективность и кэширование
  • Создаются через Dockerfile с использованием различных инструкций
  • Требуют оптимизации для минимизации размера и повышения безопасности
  • Управляются через реестры и команды Docker CLI

Ключ к успеху — понимание структуры образов, оптимизация и следование best practices!

Docker. Образы
ИППРПО

Контрольные вопросы

  1. Чем отличается Docker-образ от контейнера?
  2. Какие бывают типы Docker-образов?
  3. Что такое слои в Docker-образе и как они работают?
  4. Как оптимизировать размер Docker-образа?
  5. Зачем нужна многоэтапная сборка?
  6. Как обеспечить безопасность Docker-образов?
  7. Что делает команда docker build?
  8. Зачем нужен файл .dockerignore?
Docker. Образы
ИППРПО

Дополнительные материалы

Docker. Образы